package com.jeecg.common;

import java.text.MessageFormat;
import java.util.List;

/**
 * 提供一组常用的断言。
 * 
 * @author Debenson
 * @since 0.1
 * 
 */
public class Assert {

  /**
   * 断言参数不是null，若是null将抛出异常。
   * 
   * @param argument
   *          参数。
   * @param argumentName
   *          参数名。
   * @throws IllegalArgumentException
   *           当参数argument为null时抛出。
   */
  public static void assertArgumentNotNull(Object argument, String argumentName)
      throws IllegalArgumentException {
    if (argument == null) {
      throw new IllegalArgumentException(MessageFormat.format("指定的参数“{0}”禁止为null", argumentName));
    }
  }

  /**
   * 断言参数不是null，若是null将抛出异常。
   * 
   * @param argument
   *          参数。
   * @param argumentName
   *          参数名。
   * @throws IllegalArgumentException
   *           当参数argument为null时抛出。
   */
  public static void assertArgumentNotEmpty(String argument, String argumentName)
      throws IllegalArgumentException {
    if (argument == null || argument.trim().equals("")) {
      throw new IllegalArgumentException(MessageFormat.format("指定的参数“{0}”禁止为空串", argumentName));
    }
  }

  /**
   * 断言参数不是null，若是null将抛出异常。
   * 
   * @param argument
   *          参数。
   * @param argumentName
   *          参数名。
   * @throws IllegalArgumentException
   *           当参数argument为null时抛出。
   */
  public static void assertArgumentNotEmpty(List<?> argument, String argumentName)
      throws IllegalArgumentException {
    if (argument == null || argument.isEmpty()) {
      throw new IllegalArgumentException(MessageFormat.format("指定的参数“{0}”禁止为空列表", argumentName));
    }
  }

  /**
   * 断言参数不是null，若是null将抛出异常。
   * 
   * @param argument
   *          参数。
   * @param argumentName
   *          参数名。
   * @throws IllegalArgumentException
   *           当参数argument为null时抛出。
   */
  public static void assertArgumentNotEmpty(Object[] argument, String argumentName)
      throws IllegalArgumentException {
    if (argument == null || argument.length == 0) {
      throw new IllegalArgumentException(MessageFormat.format("指定的参数“{0}”禁止为空列表", argumentName));
    }
  }

  /**
   * 断言属性不是null，若是null将抛出异常。
   * 
   * @param attribute
   *          属性。
   * @param attributeName
   *          属性名。
   * @throws IllegalStateException
   */
  public static void assertAttributeNotNull(Object attribute, String attributeName)
      throws IllegalStateException {
    if (attribute == null) {
      throw new IllegalStateException(MessageFormat.format("属性“{0}”禁止为null", attributeName));
    }
  }

  /**
   * 断言字符串参数没有超出长度限制，若超出将抛出异常。
   * 
   * @param argument
   *          参数。
   * @param maxLength
   *          最大长度限制。
   * @param argumentName
   *          参数名。
   * @throws IllegalArgumentException
   *           当参数超出长度限制。
   */
  public static void assertStringNotTooLong(String argument, int maxLength, String argumentName)
      throws IllegalArgumentException {
    if (argument != null && argument.length() > maxLength) {
      throw new IllegalArgumentException(
          MessageFormat.format("“{0}”超出最大长度限制“{1}”", argumentName, maxLength));
    }
  }

  /**
   * 断言不支持当前操作。
   * 
   * @param methodName
   *          方法名。
   * @throws UnsupportedOperationException
   */
  public static void unsupportedOperation(String methodName) throws UnsupportedOperationException {
    throw new UnsupportedOperationException(MessageFormat.format("请勿调用此方法“{0}”", methodName));
  }
}
